#include "../../head/mainHead.h"

// 先来先服务算法
void fcfs(){
    system("cls");
    //将到达时间转化为分钟格式
    arrStrsToMin();
    // 构建到达时间队列
    queueInit();
    /* 计算结束时间
     * 执行的原则:
     *  - 按照进程到达时间队列执行
     *  - 先来先服务中执行队列顺序与到达时间队列顺序相同
    */
    for(int i = 1; i < 5; i++){
        exeQueue[i] = queue[i];
    }
    int curTime = arriveTime[exeQueue[1]]; //将第一个进程到达时间设置为初始时间点

    for(int i = 1; i < 5; i++){
        startTime[exeQueue[i]] = curTime;
        
        endTime[exeQueue[i]] = curTime + p[exeQueue[i]].Tr;
        // 计算下一个进程开始执行时间
        if(i == 4){
            break;
        }else{
            if(endTime[exeQueue[i]] > arriveTime[exeQueue[i + 1]]){
                curTime = endTime[exeQueue[i]];
            }else{
                curTime = arriveTime[exeQueue[i + 1]];
            }
        }
    }

    // 输出进程执行先后顺序
    exeOrderPrint();
    // 输出进程到达时间
    taPrint();
    // 将开始时间分钟格式转化为时分格式
    startMinToStrs();
    // 输出开始时间
    tsPrint();
    // 进程运行时间
    trPrint();
    // 将结束时间分钟格式转化为时分格式
    endMinToStrs();
    // 输出结束时间
    tfPrint();

    // 计算周转时间
    calcuTar();
    // 计算带权周转时间
    calcuTTWA();
    // 输出进程周转时间
    cycleTime();
    // 输出带权周转时间
    cycleTimeWithRight();
    // 输出平均周转时间
    avgCycleTime();
    // 输出平均带权周转时间
    avgCycleTimeWithRight();
}